package persistent.prestige.console.netty.dubbo.net;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import persistent.prestige.console.netty.dubbo.utils.LogUtils;
/**
 * 请求消息编码器，实现自定义协议,用于客户端
 * 
 * 自定义协议如下
 * 4字节的请求序列号  2字节的请求类型  2字节数据长度 2字节服务调用长度 N字节的服务调用名 2字节请求参数长度  请求参数
 * 其中请求类型为1：服务调用2：心跳包，如果是心跳包的话，只有协议头，也就是【4字节请求序列号，2字节请求类型，2字节数据长度】
 * 
 * @author prestigeding@126.com
 *
 */
public class RequestFrameEncoder extends MessageToByteEncoder<Request> {

	@Override
	protected void encode(ChannelHandlerContext ctx, Request msg, ByteBuf out)
			throws Exception {
		
		LogUtils.log("RequestFrameEncoder begin calling...requestId:%d,requestType:%d.",msg.getRequestId(), msg.getRequestType());
		
		out.writeInt(msg.getRequestId());  // requestId
		out.writeShort(msg.getRequestType());          // requestType
		
		if(msg.getRequestType() == 1 ) { //服务调用
			byte[] serviceData = msg.getService().getBytes();
			byte[] paramsData = msg.getParams().getBytes();
			int slen, plen;
			out.writeShort((
					2 + (slen = serviceData.length) + 
					2 + (plen = paramsData.length)));	
			
			out.writeShort(slen);
			out.writeBytes(serviceData);
			out.writeShort(plen);
			out.writeBytes(paramsData);
			
		} else if(msg.getRequestType() == 2 ) { //心跳包
			out.writeShort(0);
		}
		
		LogUtils.log("RequestFrameEncoder end call....");

	}
	
	

}
